package com.kuang.pay.controller;
import com.kuang.bascic.utils.AlipayUtils;
import com.kuang.order.constant.OrderConstants;
import com.kuang.order.domain.OrderAdopt;
import com.kuang.order.domain.Paybill;
import com.kuang.order.service.OrderAdoptService;
import com.kuang.order.service.PaybillService;
import com.kuang.pay.constant.PayAway;
import com.kuang.quartaz.job.CancelOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

@Controller
@RequestMapping("/pay")
public class PayCobtroller {
    @Autowired
    private PaybillService paybillService;
    @Autowired
    private OrderAdoptService orderAdoptService;
    @Autowired
    private SchedulerFactoryBean schedulerFactoryBean;
    /**
     * 同步回调 和异步回调的区别
     *   同步回调：
     *    1. 会在支付成功会回调这个接口，返回给前端页面跳转效果
     *    2. 携带制度成功或者失败的信息
     *    3，市场上同步的处理：
     *          1.如果订单成功  确认订单状态
     *          2.一定会跳转页面
     *          3.跳转页面，在页面上在查询一次
     *    同步回调：
     *    1.不涉及页面的跳转
     *    2.订单的最终状态
     *    3.修改订单状态的代码，一般都卸载异步回调
     *    4.异步回调 会多次回调 3次    支付后会回调 如果在支付的时候服务器宕机或者维护 回调会隔一会再次回调直
     *    到三次或者返回的状态为false或者true
     */
    @RequestMapping("/notify_url")
    @ResponseBody
    public String notifyUrl(HttpServletRequest request){
        // 设置异步回调支付宝消息
        //获取支付宝POST过来反馈信息
        try {
            Map<String,String> params = new HashMap<String,String>();
            Map<String,String[]> requestParams = request.getParameterMap();
            for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
                String name = (String) iter.next();
                String[] values = (String[]) requestParams.get(name);
                String valueStr = "";
                for (int i = 0; i < values.length; i++) {
                    valueStr = (i == values.length - 1) ? valueStr + values[i]
                            : valueStr + values[i] + ",";
                }
                //乱码解决，这段代码在出现乱码时使用
                valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
                params.put(name, valueStr);
            }
            //商户订单号 系统自己的订单
            String orderSn = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");
            //支付宝交易号 支付宝的交易订单
            String paysn = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");
            //交易状态
            String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8");
           // 交易成功
            if (trade_status.equals("TRADE_SUCCESS")){
                // 这里做交易成功的逻辑
                //1. 根据orderSn查询到paybill  修改paybill里的数据 状态，修改时间 三方单号
                Paybill paybill = paybillService.loadByOrderSn(orderSn);
                String businessType = paybill.getBusinessType();
                paybill.setState(1);
                paybill.setUpdateTime(new Date());
                paybill.setUnionPaySn(paysn);
                paybillService.UpdateDepartment(paybill);
                //2.找到订单类型 ，根据类型找到相应的订单系统（领养订单）
               switch (businessType){
                   case OrderConstants.ORDER_ADOPT:
                       // 通过类型查找到的订单系统
                       // 在通过id查找到订单
                   OrderAdopt orderAdopt = orderAdoptService.selectDepartmentById(paybill.getBusinessKey());
                       //3.修改AdopetOrder订单：状态，修改时间，三方单号
                        orderAdopt.setPaySn(paysn);
                        orderAdopt.setState(1);
                        orderAdoptService.UpdateDepartment(orderAdopt);
                   case OrderConstants.ORDER_PRODUCT:
                       break;
                   case OrderConstants.ORDER_GOODS:
                       break;
               }
               //删除定时任务
                CancelOrder.CancelJob(schedulerFactoryBean.getScheduler(),orderSn);

            }
            System.out.println("--------异步回调");
            return "success";

        } catch (UnsupportedEncodingException e) {
            return "fail";
        }

    }
    @RequestMapping("/return_url")
    public String returnUrl(){
        System.out.println("--------同步回调");
        return "redirect:http://127.0.0.1/success.html";
    }

}
